package com.tinet.sistReserva.web;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;

import com.tinet.sistReserva.ejb.InterfazSalaBean;
import com.tinet.sistReserva.model.Sala;
import com.tinet.sistReserva.model.util.SalaException;

/**
 * 
 * Clase ManagedBean para sala.
 * 
 * @author Frmancil
 */
@ManagedBean
@ViewScoped
public class SalaManagedBean implements Serializable {
    /**
     * Logger de clase.
     */
    private static final Logger LOG = Logger.getLogger(SalaManagedBean.class);

    /**
     * Numero serialVersionUID.
     */
    private static final long serialVersionUID = 1L;
    /**
     * Mapeo de EJB.
     */
    @EJB(mappedName = "salaBean", name = "salaBean")
    private transient InterfazSalaBean beanSala;

    /**
     * Instanciando Sala.
     */
    private Sala sala;
    /**
     * Listado de salas.
     */
    private List<Sala> salas;
    /**
     * Mensaje a entregar por pantalla.
     */
    private String message;

    /**
     * Instanciador de nueva entidad sala para cada acceso a la clase.
     */
    @PostConstruct
    public void init() {
        if (this.sala == null) {
            this.sala = new Sala();
        }
    }

    /**
     * 
     * Metodo del que se obtiene sala.
     * 
     * @return Retorna sala.
     */
    public Sala getSala() {
        return sala;
    }

    /**
     * 
     * Metodo que setea sala.
     * 
     * @param sala
     *            Sala.
     */
    public void setSala(Sala sala) {
        this.sala = sala;
    }

    /**
     * Recibe una sala creada desde la capa web y la agrega a la base de
     * datos.
     * 
     * @return El valor de retorno indica la pagina a la que redirecciona el
     *         metodo, en este caso la pagina agregarSala.
     */
    public String agregarSalaMG() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            beanSala.agregarSala(sala);
            context.addMessage(null, new FacesMessage("Exito", "Alerta: "
                    + "Sala agregada"));
        } catch (SalaException e) {
            context.addMessage(null, new FacesMessage("Alerta", "Sala existe"));
            return "agregarSala";
        }
        return "agregarSala";
    }

    /**
     * Metodo que retorna la lista de todos los usuarios.
     * 
     * @return Retorna una lista con todos los usuarios que se encuentran en
     *         la base de datos.
     */
    public List<Sala> listarSalaMG() {
        salas = beanSala.listarSalas();
        return salas;
    }

    /**
     * 
     * Growl.
     * 
     * @param msg
     *            String.
     */
    public void saveMessage(String msg) {
        FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Exito", "Your message: "
                + msg));
    }

    /**
     * 
     * Metodo que borra sala encontrada.
     * 
     * @return Retorna la redireccion a la pagina que corresponde.
     */
    public String borrarSalaMG() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            beanSala.eliminarSala(sala);
            context.addMessage(null, new FacesMessage("Exito", "Alerta: "
                    + "Sala eliminada"));
        } catch (SalaException e) {
            LOG.error("borrarSalaMG: ", e);
            context.addMessage(null, new FacesMessage("Alerta",
                    "Sala no existe"));
            return "borrar";
        }
        return "borrar";
    }

    /**
     * 
     * Metodo que actualiza la informacion de la sala.
     * 
     * @return Retorna la redireccion a la pagina que corresponde.
     */
    public String actualizarSalaMG() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            beanSala.actualizarSala(sala);
            context.addMessage(null, new FacesMessage("Exito", "Alerta: "
                    + "Usuario actualizado"));
        } catch (SalaException e) {
            LOG.error("actualizarSalaMG: ", e);
            context.addMessage(null, new FacesMessage("Alerta",
                    "Sala no existe"));
            return "actualizar";
        }
        return "actualizar";
    }

    /**
     * 
     * Metodo que busca un usuario en base de datos.
     * 
     * @param salaBuscada
     *            Sala a buscar.
     * 
     */
    public void buscarSalaMG(Sala salaBuscada) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            this.sala = beanSala.buscarSala(salaBuscada);
            org.primefaces.context.RequestContext.getCurrentInstance().update(
                    "formActualizar:actualizarUsuario");
            org.primefaces.context.RequestContext.getCurrentInstance().execute(
                    "PF('dialogoActualizarUsuario'.show()");
        } catch (SalaException e) {
            LOG.error("buscarSalaMG: ", e);
            context.addMessage(null, new FacesMessage("Alerta",
                    "Sala no existe"));

        }

    }

    /**
     * Allows to get the message attribute value.
     * 
     * @return the message value.
     */
    public String getMessage() {
        return message;
    }

    /**
     * Allows to set the message attribute value.
     * 
     * @param message
     *            new value for message attribute.
     */
    public void setMessage(String message) {
        this.message = message;
    }
}
